(deftemplate tramvai
(slot oprireStatie (allowed-values TRUE FALSE))
(slot deschidereUsi (allowed-values TRUE FALSE))
(slot inchidereUsi (allowed-values TRUE FALSE))
(slot pornireDinStatie (allowed-values TRUE FALSE))
(slot stare)
)

(assert (tramvai (oprireStatie FALSE)(deschidereUsi FALSE)(inchidereUsi FALSE)(pornireDinStatie FALSE)(stare init)))
(facts)

(printout t crlf)


(defrule oprire
?id<-(tramvai (stare init))
=>
(retract ?id)
(assert (tramvai (oprireStatie TRUE)(deschidereUsi FALSE)(inchidereUsi FALSE)(pornireDinStatie FALSE)(stare oprireStatie)))
                (printout t "Tramvaiin statie" crlf)
     

)
(run)

(printout t crlf)
(defrule deschide-usi
?id<-(tramvai (stare oprireStatie))
=>
(retract ?id)
(assert (tramvai (oprireStatie TRUE)(deschidereUsi TRUE)(inchidereUsi FALSE)(pornireDinStatie FALSE)(stare oprireInstatieSiDeschideUsi)))
                (printout t "Usa deschisa" crlf)
     

)
(run)

(printout t crlf)
(defrule inchide-usi
?id<-(tramvai (stare oprireInstatie))
=>
(retract ?id)
(assert (tramvai (oprireStatie TRUE)(deschidereUsi TRUE)(inchidereUsi TRUE)(pornireDinStatie FALSE)(stare oprireInstatieSiDeschideUsisiInchide)))
                (printout t "Usa Inchisa" crlf)
     

)
(run)

(printout t crlf)
(defrule pornire
?id<-(tramvai (stare oprireDeschideUsi))
=>
(retract ?id)
(assert (tramvai (oprireStatie TRUE)(deschidereUsi TRUE)(inchidereUsi TRUE)(pornireDinStatie TRUE)(stare oprireInstatieSiDeschideUsisiInchidesiPleaca)))
                (printout t "Tramvaiul porneste" crlf)
     

)
(run)

(printout t crlf)
(defrule finalizareStatie
?id<-(tramvai (stare oprireInchidesiPleaca))
=>
(retract ?id)
(assert (tramvai (oprireStatie TRUE)(deschidereUsi TRUE)(inchidereUsi TRUE)(pornireDinStatie TRUE)(stare gataStatie)))
(printout t "Tramvaiul ajunge in staia urmatoare" crlf)

)
(run)